#include "ipc.h"
int main()
{
	init();	//初始化相关变量
	int sofa_msg_num,wait_msg_num;
	int id=1;//用户id
	Msg_buf msg;//消息
	while(1)
	{
		msg.mid=id;//准备下一条用户的信息的编号
		int sofa_msg_num=getMsqNum(q_sofa_id);//取沙发队列消息数(查沙发上顾客数)
		if(sofa_msg_num<4)//如果消息数小于4(沙发没坐满)
		{
			int res=msgrcv(q_wait_id,&msg,sizeof(msg),WAITQUEST,IPC_NOWAIT);
			//以非阻塞方式从等候室队列接收一条信息(查等候室有顾客否)
			if(res!=-1)//如果有消息将接收到的消息发送到沙发队列(等候室顾客坐入沙发)
			{
				msg.mtype=SOFAQUEST;
				printf("%d号顾客从等候室坐入沙发\n",msg.mid);
				msgsnd(q_sofa_id,&msg,sizeof(msg),0);
			}
			else //否则发送一条信息到沙发队列(新来的顾客直接坐入沙发)
			{
				msg.mtype=SOFAQUEST;
				printf("%d号新顾客坐入沙发\n",msg.mid);
				msgsnd(q_sofa_id,&msg,sizeof(msg),0);	
				id++;	
				//printf("增加下一名用户%d\n",++id);		
			}
		}
		else	//否则(沙发坐满)
		{
			
			wait_msg_num=getMsqNum(q_wait_id);//取等候室队列消息数(查等候室顾客数)	
			if(wait_msg_num<13)//如果消息数小于13
			{	
				msg.mtype=WAITQUEST;
				printf("沙发坐满，%d号顾客在等候室等候\n",id);	
				msgsnd(q_wait_id,&msg,sizeof(msg),0);//发送一条消息到等候室队列(等候室没满，新顾客进等候室)
				id++;
				//printf("增加下一名用户%d\n",++id);
			}
			else//否则
			{	
				printf("等候室满，%d号顾客没有进入理发店\n",id);
				down(s_customer_id);//在顾客同步信号量上睡眠(等候室暂不接待新顾客)	
			}
		}		
		srand((unsigned) time(NULL)); //用时间做种，每次产生随机数不一样
		sleep(rand()%2+1);
		//用进程休眠一个随机时间模拟顾客到达的时间间隔
	}
	return 0;
}
